#include "windows.h"
#include "events.h"
#include "french.h"
#include "images.h"
#include "midi.h"

/**
 * La fenêtre principale
 * @var GtkWidget*
 */
GtkWidget *pWindow = NULL;
/**
 * Page à onglet de la fenêtre principale
 * @var GtkWidget*
 */
GtkWidget *pNotebook = NULL;
/**
 * La page de l'outil de routage MIDI
 * @var GtkWidget*
 */
GtkWidget *pRouterPage = NULL;
/**
 * Le canal d'entrée actuel
 * @var int
 */
int inputChannel = -1;
/**
 * Les boutons des canaux
 */
GtkWidget **pOutputButtons;

/**
 * Affiche la fenêtre principale
 * @param int* argc Le nombre d'argument passé au programme
 * @param char*** argv Les arguments passés au programme
 */
void showMainWindow(int *argc, char ***argv) {
	GtkWidget *pVBox;		/* Le container de la fenêtre, alignement vertical */
	GtkWidget *pMenuBar;	/* La barre de menu */
	GtkWidget *pMenu;		/* Le menu */
	GtkWidget *pMenuItem;	/* Le bouton de menu */
	GtkWidget *pImage;		/* Image GTK */
	int i;
		
	/* Initialisation de GTK+ */
	gtk_init(argc, argv);	
	
	/* Initialisation des variables */
	if(inputChannel == -1) inputChannel = 0;
	
	/*** Initialisation de la fenêtre ***/
	/* Création de la fenêtre */
	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	
	/* Fenêtre maximalisée */
	gtk_window_maximize(GTK_WINDOW(pWindow));
	/* Intitialisation de la taille de la fenêtre */
	gtk_window_set_default_size(GTK_WINDOW(pWindow), MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT);
	/* Initialisation du titre de la fenêtre */
	gtk_window_set_title(GTK_WINDOW(pWindow), MAIN_WINDOW_TITLE);
    /* Initialisation de la position */
    gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
	
	/* Connexion du signal "destroy" */
	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
	/*** Fin initialisation de la fenêtre ***/
	
	/*** Initialisation du container ***/
	pVBox = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
	/*** Fin initialisation du container ***/
	
	/*** Initialisation du menu ***/
	pMenuBar = gtk_menu_bar_new();
	/* Menu "Fichier" */
	pMenu = gtk_menu_new();
	pMenuItem = gtk_menu_item_new_with_label(MENU_FILE);
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu);
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem);
	/* - */
	pMenuItem = gtk_separator_menu_item_new();
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
	/* "Quitter" */
	pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
	g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnActivate_BtnMenu_File_Quit), (GtkWidget *) pWindow);
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
	
	/* Menu "MIDI" */
	pMenu = gtk_menu_new();
	pMenuItem = gtk_menu_item_new_with_label(MENU_MIDI);
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu);
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem);
	
	/* Menu "Outils" */
	pMenu = gtk_menu_new();
	pMenuItem = gtk_menu_item_new_with_label(MENU_TOOLS);
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu);
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem);
	/* "Routeur Midi" */
	pMenuItem = gtk_image_menu_item_new_with_label(MENU_TOOLS_BUTTON_ROUTER);
	pImage = gtk_image_new_from_file(MIDI_ROUTER_ICON);
	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(pMenuItem), pImage);
	g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(showRouterPage), (GtkWidget *) pWindow);
	gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
	
	
	/* Ajout de la barre de menu à la fenêtre */
	gtk_box_pack_start(GTK_BOX(pVBox), pMenuBar, FALSE, FALSE, 0);
	/*** Fin initialisation du menu ***/
	
	/** Initialisation de la page à onglets **/
	pNotebook = gtk_notebook_new();
	gtk_box_pack_start(GTK_BOX(pVBox), pNotebook, TRUE, TRUE, 0);
	gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pNotebook), GTK_POS_TOP);
	gtk_notebook_set_scrollable(GTK_NOTEBOOK(pNotebook), TRUE);	
	/** Fin initialisation de la page à onglet **/
	
	/* Affichage de la fenêtre */
	gtk_widget_show_all(pWindow);
	
	/* Démarrage de la boucle évènementielle */
	gtk_main();
}

/**
 * Affiche la page du Routeur MIDI
 * @param GtkWidget *widget L'objet apellant la fonction
 * @param gpointer data
 */
void showRouterPage(GtkWidget *widget, gpointer data) {
	GtkWidget *pLabel;
	GtkWidget *pHBox;
	GtkWidget *pCombo;
	GtkWidget *pButton;
	GdkColor color;
	int i;
	char *buf;
	
	if(!pRouterPage) {
		/* Ajout de la page */
		pLabel = gtk_label_new(TOOLS_ROUTER);
		pRouterPage = gtk_vbox_new(FALSE, 0);
		gtk_notebook_append_page(GTK_NOTEBOOK(pNotebook), pRouterPage, pLabel);
		
		/** Selection du canal d'entrée **/
		pHBox = gtk_hbox_new(FALSE, 0);		
		pLabel = gtk_label_new(ROUTER_TXT_SELECT_INPUT_CHANNEL);
		gtk_box_pack_start(GTK_BOX(pHBox), pLabel, FALSE, FALSE, 0);
		pLabel = gtk_label_new(" : ");
		gtk_box_pack_start(GTK_BOX(pHBox), pLabel, FALSE, FALSE, 0);
		pCombo = gtk_combo_box_new_text();
		
		buf = (char *) malloc(3 * sizeof(char));
		for(i=1; i<17; i++) {
			sprintf(buf, "%d", i);
			gtk_combo_box_append_text(GTK_COMBO_BOX(pCombo), buf);
		}
		free(buf);
		gtk_combo_box_set_active(GTK_COMBO_BOX(pCombo), inputChannel);
		gtk_box_pack_start(GTK_BOX(pHBox), pCombo, FALSE, FALSE, 0);
		g_signal_connect(G_OBJECT(pCombo), "changed", G_CALLBACK(OnChanged_Router_CbBox_Input_Channel), (GtkWidget *) pWindow);
		gtk_box_pack_start(GTK_BOX(pRouterPage), pHBox, FALSE, TRUE, 0);
		
		/** Selection du canal de sortie **/
		pLabel = gtk_label_new(ROUTER_TXT_SELECT_OUTPUT_CHANNEL);
		gtk_box_pack_start(GTK_BOX(pRouterPage), pLabel, FALSE, TRUE, 20);
		
		pHBox = gtk_hbox_new(FALSE, 0);
		buf = (char *) malloc(3 * sizeof(char));
		pOutputButtons = malloc(16 * sizeof(GtkWidget *));
		for(i=1; i<17; i++) {
			sprintf(buf, "%d", i);
			pButton = gtk_button_new_with_label(buf);
			gdk_color_parse ("#337733", &color);
			if(get_output_channel(inputChannel) == (i-1)) {
				gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_SELECTED, &color);
				gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_NORMAL, &color);
			}
			pOutputButtons[i-1]=pButton;
			g_signal_connect(G_OBJECT(pButton), "pressed", G_CALLBACK(OnActivate_Router_Btn_Output_Channel), (GtkWidget *) pWindow);
			gtk_box_pack_start(GTK_BOX(pHBox), pButton, TRUE, TRUE, 0);
		}
		free(buf);
		gtk_box_pack_start(GTK_BOX(pRouterPage), pHBox, FALSE, TRUE, 0);
		/* Rafraichissement de la fenêtre */
		gtk_widget_show_all(pWindow);
	}
}


/**
 * Fonction permettant de quitter l'application
 */
void quit() {
	gtk_main_quit();
}
/**
 * Fonction d'évènement de fermeture de fenêtre
 * @param GtkWidget *pWidget La fenêtre détruite
 * @param gpointer pData
 */
void OnDestroy(GtkWidget *pWidget, gpointer pData) {
	/* Arrêt de la boucle évènementielle */
	quit();
}

/**
 * Fonction d'évènement de click sur le bouton du menu Fichier->Quitter
 * @param GtkWidget *widget Le bouton quitter
 * @param gpointer data
 */
void OnActivate_BtnMenu_File_Quit(GtkWidget *widget, gpointer data) {
	/* Arrêt de la boucle évènementielle */
	quit();
}

/**
 * Fonction de changement du canal d'entrée dans l'interface routeur
 * @param GtkWidget *widget Le combobox de canal d'entrée
 * @param gpointer
 */
void OnChanged_Router_CbBox_Input_Channel(GtkWidget *widget, gpointer data) {
	int i;
	int o = get_output_channel(gtk_combo_box_get_active(GTK_COMBO_BOX(widget)));
	GdkColor color;
	GtkWidget *pButton;
	
	gdk_color_parse ("#337733", &color);
	
	for(i=0; i<16; i++) {
		pButton = pOutputButtons[i];
		if(i == o) {
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_SELECTED, &color);
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_NORMAL, &color);		
		}else {
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_SELECTED, NULL);
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_NORMAL, NULL);			
		}
	}
	
	inputChannel = o;
}

/**
 * Fonction de clic sur un bouton de canal de sortie dans l'interface routeur
 * @param GtkWidget *widget Le bouton appuyé
 * @param gpointer
 */
void OnActivate_Router_Btn_Output_Channel(GtkWidget *widget, gpointer data) {
	int i, o;
	GtkWidget *pButton;
	GdkColor color;
	
	gdk_color_parse ("#337733", &color);
		
	for(i=0; i<16; i++) {
		pButton = pOutputButtons[i];
		if(widget == pOutputButtons[i]) {
			o=i;
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_SELECTED, &color);
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_NORMAL, &color);
		}else {
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_SELECTED, NULL);
			gtk_widget_modify_bg(GTK_WIDGET(pButton), GTK_STATE_NORMAL, NULL);			
		}
	}
	
	if(!set_output_channel(inputChannel, o)) exit(1);
}
